#ifndef DOWNLOAD_H
#define DOWNLOAD_H

#include <stdbool.h>
#include <stdint.h>

// 下载模块错误码
#define DOWNLOAD_SUCCESS        0
#define DOWNLOAD_ERROR_INIT     -1
#define DOWNLOAD_ERROR_START    -2
#define DOWNLOAD_ERROR_STOP     -3
#define DOWNLOAD_ERROR_FILE     -4

// 下载类型
enum download_type {
    DOWNLOAD_TYPE_VIDEO,
    DOWNLOAD_TYPE_PHOTO,
    DOWNLOAD_TYPE_LOG,
    DOWNLOAD_TYPE_CONFIG
};

// 下载状态
enum download_status {
    DOWNLOAD_STATUS_IDLE,
    DOWNLOAD_STATUS_DOWNLOADING,
    DOWNLOAD_STATUS_PAUSED,
    DOWNLOAD_STATUS_COMPLETED,
    DOWNLOAD_STATUS_FAILED
};

// 下载任务结构体
typedef struct {
    int task_id;
    enum download_type type;
    char remote_path[256];
    char local_path[256];
    uint64_t total_size;
    uint64_t downloaded_size;
    enum download_status status;
    int error_code;
} download_task_t;

/**
 * @brief 初始化下载模块
 * @return 成功返回DOWNLOAD_SUCCESS，失败返回错误码
 */
int download_init(void);

/**
 * @brief 清理下载模块资源
 */
void download_cleanup(void);

/**
 * @brief 创建下载任务
 * @param type 下载类型
 * @param remote_path 远程文件路径
 * @param local_path 本地保存路径
 * @return 成功返回任务ID，失败返回-1
 */
int download_create_task(enum download_type type, const char *remote_path, const char *local_path);

/**
 * @brief 开始下载任务
 * @param task_id 任务ID
 * @return 成功返回DOWNLOAD_SUCCESS，失败返回错误码
 */
int download_start_task(int task_id);

/**
 * @brief 暂停下载任务
 * @param task_id 任务ID
 * @return 成功返回DOWNLOAD_SUCCESS，失败返回错误码
 */
int download_pause_task(int task_id);

/**
 * @brief 取消下载任务
 * @param task_id 任务ID
 * @return 成功返回DOWNLOAD_SUCCESS，失败返回错误码
 */
int download_cancel_task(int task_id);

/**
 * @brief 获取下载任务状态
 * @param task_id 任务ID
 * @param task 任务信息（输出参数）
 * @return 成功返回DOWNLOAD_SUCCESS，失败返回错误码
 */
int download_get_task_status(int task_id, download_task_t *task);

/**
 * @brief 注册下载进度回调函数
 * @param callback 回调函数指针
 * @param user_data 用户数据
 */
typedef void (*download_progress_cb)(int task_id, uint64_t downloaded, uint64_t total, void *user_data);
void download_register_progress_callback(download_progress_cb callback, void *user_data);

#endif /* DOWNLOAD_H */